/******************************************************
 * @file ascii.c
 * @author Destiny 
 * @brief ASCII解码程序，支持ASCII编码解码
 * 
 * @version 0.1
 * @date 2024-07-18
 *****************************************************/
#include <config.h>
#include <encoding_manager.h>
#include <string.h>

static int isAsciiCoding(uint8_t *pucBufHead);               /*判断是否是Ascii编码*/
static int AsciiGetCodeFrmBuf(uint8_t *pucBufStart, uint8_t *pucBufEnd, uint32_t *pdwCode);  /*解码函数*/
/*构造Ascii解码操作结构体*/
static T_EncodingOpr g_tAsciiEncodingOpr = {
	.name          = "ascii",
	.iHeadLen      = 0,
	.isSupport     = isAsciiCoding,
	.GetCodeFrmBuf = AsciiGetCodeFrmBuf,
};
/*
 * @description		    	: 判断是否是Ascii编码
 * @param - pucBufHead	 	: 文件起始地址
 * @return 			    	: 1 支持;其他 不支持
 */
static int isAsciiCoding(uint8_t *pucBufHead)
{
	const char aStrUtf8[]    = {0xEF, 0xBB, 0xBF, 0};   /* UTF-8 文件头*/
	const char aStrUtf16le[] = {0xFF, 0xFE, 0};			/* UTF16LE 文件头*/
	const char aStrUtf16be[] = {0xFE, 0xFF, 0};			/* UTF16BE 文件头*/
	
	if (strncmp((const char*)pucBufHead, aStrUtf8, 3) == 0)
	{
		return 0;
	}
	else if (strncmp((const char*)pucBufHead, aStrUtf16le, 2) == 0)
	{
		
		return 0;
	}
	else if (strncmp((const char*)pucBufHead, aStrUtf16be, 2) == 0)
	{
		
		return 0;
	}
	else
	{
		return 1;
	}
}
/*
 * @description		    	: 解码函数，支持ASCII。
 * @param - pucBufStart 	: 文件当前读取起始地址
 * @param - pucBufEnd 		: 文件尾部地址
 * @param - pdwCode 		: unicode编码
 * @return 			    	: 编码字节数
 */
static int AsciiGetCodeFrmBuf(uint8_t *pucBufStart, uint8_t *pucBufEnd, uint32_t *pdwCode)
{
	uint8_t *pucBuf = pucBufStart;
	uint8_t c = *pucBuf;
	/*ASCII编码范围0x00～0xff*/
	if ((pucBuf < pucBufEnd) && (c < (uint8_t)0x80))   
	{
		/*返回ASCII码*/
		*pdwCode = (uint32_t)c;
		return 1;
	}
	/*大于0x00，GBK编码*/
	if (((pucBuf + 1) < pucBufEnd) && (c >= (uint8_t)0x80)) 
	{
		*pdwCode = pucBuf[0] + (((uint32_t)pucBuf[1])<<8);
		return 2;
	}

	if (pucBuf < pucBufEnd)
	{
		/*可能出现错误*/
		*pdwCode = (uint32_t)c;
		return 1;
	}
	else
	{
		return 0;
	}
}
/*
 * @description		    	: 解码方法初始化
 * @param - 			 	: 无
 * @return 			    	: 0 成功;其他 失败
 */
int AsciiEncodingInit(void)
{
	/*添加该方法支持的字库*/
	AddFontOprForEncoding(&g_tAsciiEncodingOpr, GetFontOpr("freetype"));
	AddFontOprForEncoding(&g_tAsciiEncodingOpr, GetFontOpr("ascii"));
	return RegisterEncodingOpr(&g_tAsciiEncodingOpr);
}

